﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using TCC_Hotel.Serviços.BDServices;
using TCC_Hotel.Entidades;
using TCC_Hotel.Serviços.OtherServices;
using TCC_Hotel.Entidades.Basicas;

namespace TCC_Hotel.Apresentacao.Reservas
{
    public partial class EditarReservasParticulares : System.Web.UI.Page
    {
        ReservaService servico = new ReservaService();
        ApartamentoService servico_Apartamento = new ApartamentoService();


        /// <summary>
        /// Carregamento da página
        /// </summary>
        protected void Page_Load(object sender, EventArgs e)
        {
            //Recupera o usuario corrente
            string usuario = Request.ServerVariables["AUTH_USER"].ToString();
            LoginService servico_Login = new LoginService();
            //Verifica permissao ao acesso da página
            if (!servico_Login.RecuperarPermissaoCache(usuario).Reservas)
            {
                //Redireciona para a pagina inicial
                Response.Redirect("~/");
            }

            if (!IsPostBack)
            {
                //Se nao vier parametro, redireciona o usuario para a tela inicial
                if (Request.Params["id"] == null)
                {
                    //Redireciona para a pagina inicial
                    Response.Redirect("~/");
                }

                //Recupera o parametro da URL
                string ID = Request.Params["id"];

                //chama o serviço que busca no banco de dados o funcionario correspondente
                Reserva_Particular reserva = servico.RecuperarDetalhesReservaParticular(Convert.ToInt32(ID));

                string apartamento = servico_Apartamento.RecuperarDetalhesApartamento(reserva.Numero_Apartamento).Nome;

                //Monta o formulario para o usuario
                if (reserva != null)
                {
                    txtNome.Text = reserva.Nome_Reserva;
                    txtRGReserva.Text = reserva.RG_Reserva;
                    txtDDDTelefone.Text = reserva.Telefone.Substring(0, 2);
                    txtTelefone.Text = reserva.Telefone.Substring(2);
                    txtCPFReserva.Text = reserva.CPF_Reserva;
                    txtDataInicio.Text = Convert.ToString(reserva.Data_Inicio).Substring(0, 10);
                    txtDataFinal.Text = Convert.ToString(reserva.Data_Final).Substring(0, 10);
                    txtApartamento.Text = apartamento;
                    txtCodigoSeguranca.Text = Convert.ToString(reserva.Cartao_Credito.Codigo_Seguranca);
                    txtNumerocartao.Text = reserva.Cartao_Credito.Numero;
                    txtNomeCartao.Text = reserva.Cartao_Credito.Nome;
                    txtValidade.Text = Convert.ToString(reserva.Cartao_Credito.Validade).Substring(0, 10);
                    ddlBandeira.SelectedValue = reserva.Cartao_Credito.Bandeira;
                    txtNome2.Text = reserva.Nome_2;
                    txtRG2.Text = reserva.RG_2;
                    txtNome3.Text = reserva.Nome_3;
                    txtRG3.Text = reserva.RG_3;
                    txtNome4.Text = reserva.Nome_4;
                    txtRG4.Text = reserva.RG_4;
                    txtNome5.Text = reserva.Nome_5;
                    txtRG5.Text = reserva.RG_5;
                }
            }
        }

        /// <summary>
        /// Evento de click do botão salvar
        /// </summary>
        protected void btnSalvar_Click(object sender, EventArgs e)
        {
           
            //Recupera o parametro da URL
            int ID = Convert.ToInt32(Request.Params["id"]);
            int numeroApartamento = Convert.ToInt32(Request.Params["numeroApartamento"]);

            ComumServices comum = new ComumServices();

            //preenche a lista obrigatoria para verificar se todos os campos obrigatorios foram preenchidos
            List<string> listaObrigatoria = new List<string>() 
            { 
                txtNome.Text.Trim(),
                txtCPFReserva.Text,
                txtRGReserva.Text, 
                txtNumerocartao.Text,
                txtValidade.Text,
                txtCodigoSeguranca.Text,
                txtTelefone.Text,
                txtDDDTelefone.Text,
                txtNomeCartao.Text.Trim()
                            
            };

            //verifica se algum campo obrigatorio nao foi preenchido
            if (!comum.ValidaCamposObrigatorios(listaObrigatoria))
            {
                MensagemJS("ERRO: Campo(s) obrigatório(s) em branco");
                return;
            }
            

            //faz a validação da data de validade do cartão          
            if (!comum.ValidaDataVencimentoCartao(txtValidade.Text))
            {
                MensagemJS("ERRO: Data inválida ou com vencimento maior que 10 anos");
                return;
            }

            //Faz validação do CPF
            if (!comum.ValidaCPF(txtCPFReserva.Text))
            {
                MensagemJS("ERRO: CPF digitado não é válido");
                return;
            }


            //Faz validação dos Rgs e nomes
            List<string> RGs = new List<string>();
            List<string> Nomes = new List<string>();

            Nomes.Add(txtNome2.Text);
            Nomes.Add(txtNome3.Text);
            Nomes.Add(txtNome4.Text);
            Nomes.Add(txtNome5.Text);

            RGs.Add(txtRG2.Text);
            RGs.Add(txtRG3.Text);
            RGs.Add(txtRG4.Text);
            RGs.Add(txtRG5.Text);


            if (!comum.ValidaNomesRG(RGs, Nomes))
            {
                MensagemJS("ERRO: Para cada RG digitado, deve-se preencher um nome");
                return;
            }


            //Faz validação do RG de reserva            
            if (!comum.ValidaRG(txtRGReserva.Text) || !comum.ValidaRG(txtRG2.Text) || !comum.ValidaRG(txtRG3.Text) || !comum.ValidaRG(txtRG4.Text) || !comum.ValidaRG(txtRG5.Text))
            {
                MensagemJS("ERRO: RG(s) digitado(s) não é(são) válido(s)");
                return;
            }

            //Faz validação dos telefones
            List<string> DDDs = new List<string>();
            List<string> Telefones = new List<string>();

            Telefones.Add(txtTelefone.Text);
            DDDs.Add(txtDDDTelefone.Text);

            //Chama o serviço que valida o telefone
            if (!comum.ValidaTelefones(DDDs, Telefones))
            {
                MensagemJS("ERRO: Telefone digitado não é válido");
                return;
            }

            //monta o objeto reserva com os valores digitados do usuário
            try
            {
                Reserva_Particular reserva = new Reserva_Particular()
                {
                    CPF_Reserva = txtCPFReserva.Text,
                    RG_Reserva = txtRGReserva.Text,
                    Nome_Reserva = txtNome.Text,
                    Telefone = (txtDDDTelefone.Text + txtTelefone.Text),
                    Nome_2 = txtNome2.Text,
                    RG_2 = txtRG2.Text,
                    Nome_3 = txtNome3.Text,
                    RG_3 = txtRG3.Text,
                    Nome_4 = txtNome4.Text,
                    RG_4 = txtRG4.Text,
                    Nome_5 = txtNome5.Text,
                    RG_5 = txtRG5.Text,
                    Data_Inicio = Convert.ToDateTime(txtDataInicio.Text),
                    Data_Final = Convert.ToDateTime(txtDataFinal.Text),
                    Numero_Apartamento = numeroApartamento,

                    Cartao_Credito = new Cartao()
                    {
                        Bandeira = ddlBandeira.SelectedValue,
                        Codigo_Seguranca = Convert.ToInt32(txtCodigoSeguranca.Text),
                        Nome = txtNomeCartao.Text,
                        Numero = txtNumerocartao.Text,
                        Validade = Convert.ToDateTime(txtValidade.Text)

                    }

                };



                //chama o serviço que edita a reserva no banco de dados
                if (servico.EditarReservaParticular(reserva, ID))
                {
                    MensagemJS("Reserva editada com sucesso!");
                    HttpContext.Current.Cache.Remove("Lista_Reserva_Particular");
                    HttpContext.Current.Cache.Remove("Lista_Reserva_Faturada");
                 }
                else
                {
                    MensagemJS("ERRO: Ocorreu um erro!");
                    return;
                }

            }
            catch (Exception)
            {
                //se ocorrer exceção lanca mensagem para o usuário
                MensagemJS("ERRO: Campo(s) com valor(es) inválido(s)");
                return;

            }
           
        }


        /// <summary>
        /// Limpa todos os campos
        /// </summary>        
        protected void btnLimpar_Click(object sender, EventArgs e)
        {
            txtNome.Text = null;
            txtCPFReserva.Text = null;
            txtRGReserva.Text = null;
            txtNumerocartao.Text = null;
            txtValidade.Text = null;
            txtCodigoSeguranca.Text = null;
            txtNomeCartao.Text = null;
            txtTelefone.Text = null;
            txtDDDTelefone.Text = null;
            txtNome2.Text = null;
            txtRG2.Text = null;
            txtNome3.Text = null;
            txtRG3.Text = null;
            txtNome4.Text = null;
            txtRG4.Text = null;
            txtNome5.Text = null;
            txtRG5.Text = null;

        }

        /// <summary>
        /// Evento de click do botao voltar 
        /// </summary>
        protected void btnVoltar_Click(object sender, EventArgs e)
        {
            Response.Redirect("~/Apresentacao/Reservas/ListarReservasParticulares.aspx");
        }

        /// <summary>
        /// Lança um popup em javaScript com alguma mensagem
        /// </summary>
        /// <param name="msg">Mensagem do popup</param>
        public void MensagemJS(string msg)
        {
            //Formata um alert para o usuário
            Page.ClientScript.RegisterStartupScript(

                     this.GetType(),

                     "error",

                     "$(window).load(function(){alert('" + msg + "')});",

                     true);

        }
    }
}